Package org.python.pydev.parser.prettyprinter

Source Code of org.python.pydev.parser.prettyprinter.AbstractPrettyPrinterTestBase

/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.parser.prettyprinter;

import java.io.File;
import java.io.IOException;

import org.python.pydev.parser.PyParserTestBase;
import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.prettyprinterv2.IPrettyPrinterPrefs;
import org.python.pydev.parser.prettyprinterv2.MakeAstValidForPrettyPrintingVisitor;
import org.python.pydev.parser.prettyprinterv2.PrettyPrinterPrefsV2;
import org.python.pydev.parser.prettyprinterv2.PrettyPrinterV2;
import org.python.pydev.parser.visitors.comparator.DifferException;
import org.python.pydev.parser.visitors.comparator.SimpleNodeComparator;

import com.aptana.shared_core.io.FileUtils;

public class AbstractPrettyPrinterTestBase extends PyParserTestBase {

    public static boolean DEBUG = false;

    protected IPrettyPrinterPrefs prefs;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        prefs = new PrettyPrinterPrefsV2("\n", "    ", versionProvider);
    }

    public SimpleNode checkPrettyPrintEqual(String s, String expected) throws Error {
        return checkPrettyPrintEqual(s, prefs, expected, expected, expected);
    }

    public SimpleNode checkPrettyPrintEqual(String s, String expected, String v2) throws Error {
        return checkPrettyPrintEqual(s, prefs, expected, v2, v2);
    }

    public SimpleNode checkPrettyPrintEqual(String s, String expected, String v2, String v3) throws Error {
        return checkPrettyPrintEqual(s, prefs, expected, v2, v3);
    }

    public SimpleNode checkPrettyPrintEqual(String s) throws Error {
        return checkPrettyPrintEqual(s, s);
    }

    /**
     * @param s
     * @return
     * @throws Exception
     * @throws IOException
     */
    public static SimpleNode checkPrettyPrintEqual(String s, IPrettyPrinterPrefs prefs, String withLinesAndCols,
            String withoutSpecials, String scrambledLines) throws Error {
        SimpleNode node = parseLegalDocStr(s);

        //Scramble the lines/columns
        SimpleNode copy = node.createCopy();
        MessLinesAndColumnsVisitor messLinesAndColumnsVisitor = new MessLinesAndColumnsVisitor();
        try {
            copy.accept(messLinesAndColumnsVisitor);
            MakeAstValidForPrettyPrintingVisitor.makeValid(copy);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        assertEquals(scrambledLines, makePrint(prefs, copy));

        //Without specials: When creating a copy, the specials won't go along.
        assertEquals(withoutSpecials, makePrint(prefs, node.createCopy()));

        //Regular
        assertEquals(withLinesAndCols, makePrint(prefs, node));
        return node;
    }

    /**
     * @param prefs
     * @param node
     * @return
     * @throws Exception
     */
    public static String makePrint(IPrettyPrinterPrefs prefs, SimpleNode node) throws Error {
        PrettyPrinterV2 printer = new PrettyPrinterV2(prefs);
        String result = "";
        try {
            result = printer.print(node);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (DEBUG) {
            System.out.println("\n\nResult:\n");
            System.out.println("'" + result + "'");
            //            System.out.println("'"+result.replace(' ', '.').replace('\t', '^')+"'");
        }
        return result;
    }

    /**
     * @param file
     * @throws Exception
     */
    protected void parseAndReparsePrettyPrintedFilesInDir(File file) throws Exception {
        assertTrue("Dir does not exist: " + file, file.exists());
        assertTrue(file.isDirectory());
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            File f = files[i];
            parseAndPrettyPrintFile(f);
        }
    }

    protected void parseAndPrettyPrintFile(File f) throws Error, Exception {
        String lowerCase = f.getAbsolutePath().toLowerCase();
        if (lowerCase.endsWith(".py")) {
            SimpleNode original = parseLegalDocStr(FileUtils.getFileContents(f), f);
            if (original == null) {
                fail("Error\nUnable to generate the AST for the file:" + f);
            }
            String result = null;
            SimpleNode node = null;
            try {
                result = PrettyPrinterTest.makePrint(prefs, original);
                node = parseLegalDocStr(result);
            } catch (Throwable e) {
                printErrorAndFail(f, original, result, e);
            }
            makeCompare(f, original, node);

            String result2 = null;
            SimpleNode nodePrintingWithoutSpecials = null;
            try {
                //Ok, first print done... go on and create a version without the specials.
                SimpleNode node2 = node.createCopy();
                result2 = PrettyPrinterTest.makePrint(prefs, node2);
                nodePrintingWithoutSpecials = parseLegalDocStr(result2);
            } catch (Throwable e) {
                printErrorAndFail(f, original, result2, e);
            }
            makeCompare(f, original, nodePrintingWithoutSpecials);

        }
    }

    private void makeCompare(File f, SimpleNode original, SimpleNode node) throws Exception {
        SimpleNodeComparator comparator = new SimpleNodeComparator();
        try {
            comparator.compare(original, node);
        } catch (DifferException e) {
            System.out.println("Compare did not suceed:" + f);
        }
    }

    private void printErrorAndFail(File f, SimpleNode original, String result2, Throwable e) {
        System.out.println("\n\n\n----------------- Initial contents:-------------------------\n");
        System.out.println(original);
        System.out.println("\n\n--------------Pretty-printed contents:------------------\n");
        System.out.println(result2);
        System.out.println("\n\n\n");
        System.out.println("File: " + f);
        e.printStackTrace();

        fail("Error\nUnable to pretty-print regenerated file:" + f);
    }

}
TOP

Related Classes of org.python.pydev.parser.prettyprinter.AbstractPrettyPrinterTestBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.